Fix time handling on x86/64.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 10 Aug 2005 12:56:47 +0000 (12:56 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 10 Aug 2005 12:56:47 +0000 (12:56 +0000)
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/arch/xen/i386/kernel/time.c
xen/arch/x86/time.c

index e188d0bcbf1eb92962d1a5427af4dce19fd8302d..e7da29dedecacd9d66ff8176fcdd2d0b4cdca187 100644 (file)
@@ -173,13 +173,16 @@ struct timer_opts timer_tsc = {
 static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
 {
        u64 product;
+#ifdef __i386__
        u32 tmp1, tmp2;
+#endif
 
        if ( shift < 0 )
                delta >>= -shift;
        else
                delta <<= shift;
 
+#ifdef __i386__
        __asm__ (
                "mul  %5       ; "
                "mov  %4,%%eax ; "
@@ -190,6 +193,11 @@ static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
                "adc  %5,%%edx ; "
                : "=A" (product), "=r" (tmp1), "=r" (tmp2)
                : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
+#else
+       __asm__ (
+               "mul %%rdx ; shrd $32,%%rdx,%%rax"
+               : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
+#endif
 
        return product;
 }
index ade1f2f75854e0ce69c4155384609ea4cd9810fc..092a3d2f733e2c49965f0f49037f37cb90fe0ddb 100644 (file)
@@ -103,13 +103,16 @@ static inline u32 mul_frac(u32 multiplicand, u32 multiplier)
 static inline u64 scale_delta(u64 delta, struct time_scale *scale)
 {
     u64 product;
+#ifdef CONFIG_x86_32
     u32 tmp1, tmp2;
+#endif
 
     if ( scale->shift < 0 )
         delta >>= -scale->shift;
     else
         delta <<= scale->shift;
 
+#ifdef CONFIG_X86_32
     __asm__ (
         "mul  %5       ; "
         "mov  %4,%%eax ; "
@@ -120,6 +123,11 @@ static inline u64 scale_delta(u64 delta, struct time_scale *scale)
         "adc  %5,%%edx ; "
         : "=A" (product), "=r" (tmp1), "=r" (tmp2)
         : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (scale->mul_frac) );
+#else
+    __asm__ (
+        "mul %%rdx ; shrd $32,%%rdx,%%rax"
+        : "=a" (product) : "0" (delta), "d" ((u64)scale->mul_frac) );
+#endif
 
     return product;
 }